/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model;

import connections.Query;
import main.ApplicatieMain;

/**
 *
 * @author Jeroen
 */
public class WoordRaden {

    private ApplicatieMain applicatieMain;
    private Query query;
    /**
     * constructor
     */
    public WoordRaden() {
        applicatieMain = ApplicatieMain.getInstance();
        query = applicatieMain.getQuery();
    }

    /**
     * Deze methode start het spel.
     */
    private void startSpel() {
        applicatieMain.setPlaying(true);
    }

    /**
     * Deze methode haalt een willekeurig woord uit de MySQL database.
     */
    public void nieuwWoord() {
        
        double userlevel = applicatieMain.getUserNiveau()/10;
        System.out.println("userLevel: "+ applicatieMain.getUserNiveau());
        int realNiveau = (int) Math.floor(userlevel);
        if(realNiveau < 1){
            realNiveau = 1;
        }
        if(realNiveau > 10){
            realNiveau = 10;
        }
        System.out.println("Userniveau: "+ realNiveau);

        String galgjeWoord = query.getRandomWord(realNiveau,applicatieMain.getSelectedWoordenlijst()); // Random woord
        applicatieMain.woordHint(galgjeWoord);
        applicatieMain.woordDifficulty(galgjeWoord);
        applicatieMain.setGebruikteLetters(new char[applicatieMain.getGebruikteLetters().length]); // Reset gebruikte letters
        applicatieMain.setGalgjeWoord(galgjeWoord); // Set galgje woord
        //System.out.println("Gebruiker zit op niveau: "+ realNiveau);
        System.out.println("Woord zit op niveau: "+ query.getWordDifficulty(query.getWordID(galgjeWoord,
                applicatieMain.getSelectedWoordenlijst()),
                applicatieMain.getSelectedWoordenlijst()));
        System.out.println("DEBUG: Momenteel is het woord: " + galgjeWoord);
        applicatieMain.setGeraden(0);
        startSpel();
    }

    public void setWoord(String word) {
        String galgjeWoord = word; // the word selected by the other client
        applicatieMain.woordHint(galgjeWoord);
        applicatieMain.woordDifficulty(galgjeWoord);
        applicatieMain.setGebruikteLetters(new char[applicatieMain.getGebruikteLetters().length]); // Reset gebruikte letters
        applicatieMain.setGalgjeWoord(galgjeWoord); // Set galgje woord
        System.out.println("DEBUG: Momenteel is het woord: " + galgjeWoord);
        applicatieMain.setGeraden(0);
        startSpel();
    }

    /**
     * Deze methode genereer een chararray met het galgje woord in verborgen fase
     * @param string Dit is een woord dat er verborgen wordt.
     * @return tempchar Dit is het woord in verborgen fase als chararray.
     */
    public char[] verbergString(String string, char key) {
        char[] tempchar = new char[string.length() * 2]; // Char array om makkelijk het woord te bewerken
        for (int i = 0; i < string.length(); i++) {
            tempchar[i * 2] = key;
            tempchar[i * 2 + 1] = ' '; // Spaties tussen de strepen
        }
        return tempchar;
    }

    /**
     * Deze methode gebruikt het verborgen woord en combineert dit met de gebruikteletters
     * @return woord Het verborgen woord met daarin de gebruikteletters zichtbaar
     */
    public char[] getVerborgenWoord(boolean localOnly) {
        String galgjeWoord = applicatieMain.getGalgjeWoord().toUpperCase();
        char woord[] = verbergString(galgjeWoord, '_');
        char gebruikteLetters[] = applicatieMain.getGebruikteLetters();

        if(localOnly){
            for (int i = 0; i < galgjeWoord.length(); i++) {
                for (char c : gebruikteLetters) { // Foreach lop door alle gebruikte letters.
                    if (c == galgjeWoord.charAt(i)) { // Zit de letter erin?
                        woord[i * 2] = c;
                        break;
                    }
                }
            }
        }
        else{
            for (int i = 0; i < galgjeWoord.length(); i++) {
                for (char c : gebruikteLetters) { // Foreach lop door alle gebruikte letters.
                    if (c == galgjeWoord.charAt(i)) { // Zit de letter erin?
                        woord[i * 2] = '#';
                        break;
                    }
                }
            }
        }
        return woord;
    }

    /**
     * Deze methode kijkt of een woord geldig is
     * @param antwoord Het antwoord dat gecontroleerd moet worden
     * @return true als het geldig is, false als het ongeldig is
     */
    public boolean isGeldigAntwoord(String antwoord) {
        return antwoord.equalsIgnoreCase(applicatieMain.getGalgjeWoord().toUpperCase());
    }

    /**
     * Deze methode kijkt of een letter geldig is.
     * @param letter De letter die gecontroleerd moet worden
     * @return true als de letter geldig is, false als de letter ongeldig is
     */
    public boolean isGeldigeLetter(char letter) {
        return letter >= 'A' && letter <= 'z' ? true : false; // Chars zijn eigelijk getallen in de computer.
    }

    /**
     * Deze methode controleerd of een letter is gebruikt
     * @param letter De letter die gecontroleerd moet worden
     * @return true als de letter gebruikte, anders false
     */
    public boolean isLetterGebruikt(char letter) {
        char gebruikteLetters[] = applicatieMain.getGebruikteLetters();
        for (char c : gebruikteLetters) {
            if (c == letter) {
                return true;
            }
        }
        return false;
    }

    /**
     * Deze methode bekijkt of er nog '_' het verborgen woord zit. Zoniet dan is het woord geraden.
     * @return true als het geraden is, anders false
     */
    public boolean isWoordGeraden() {
        char[] verborgenwoord = getVerborgenWoord(true);
        for (char c : verborgenwoord) {
            if (c == '_') {
                return false;
            }
        }
        return true;
    }

    /**
     * Deze methode voegt gebruikteletters toe aan de gebruikteLetters charArray.
     * @param letter De letter die toegevoegd moet worden.
     */
    public void voegGebruikteLetterToe(char letter) {
        char gebruikteLetters[] = applicatieMain.getGebruikteLetters();
        for (int i = 0; i < gebruikteLetters.length; i++) {
            if (!isGeldigeLetter(gebruikteLetters[i])) {
                gebruikteLetters[i] = letter;
                break;
            }
        }
    }
}
